package com.yy.tankgame;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 *+将坦克换成图片image
 *private static Toolkit tk = Toolkit.getDefaultToolkit();
 *	private static Image[] images = null;
 *@author Yun
 *@date 2014-9-8
 *@version 1.4
 */


public class Tank {
	
	public static final int XSPEED = 10;
	public static final int YSPEED = 10;
	int x, y;
	private  int oldX, oldY;
	
	private BloodBar bb = new BloodBar();
	
	private boolean live = true;
	private boolean good;
	
	private static Toolkit tk = Toolkit.getDefaultToolkit();
	private static Image[] tankImages = null;
	private static Map<String, Image> image = new HashMap<String, Image>();
	static {
		
		tankImages = new Image[]{
			tk.getImage(Tank.class.getClassLoader().getResource("images/tank.jpg")),
			tk.getImage(Tank.class.getClassLoader().getResource("images/tank.jpg")),
			tk.getImage(Tank.class.getClassLoader().getResource("images/tank.jpg")),
			tk.getImage(Tank.class.getClassLoader().getResource("images/tank.jpg")),
			tk.getImage(Tank.class.getClassLoader().getResource("images/tank.jpg")),
			tk.getImage(Tank.class.getClassLoader().getResource("images/tank.jpg")),
			tk.getImage(Tank.class.getClassLoader().getResource("images/tank.jpg")),
			tk.getImage(Tank.class.getClassLoader().getResource("images/tank.jpg")),
			tk.getImage(Tank.class.getClassLoader().getResource("images/tank.jpg")),
			tk.getImage(Tank.class.getClassLoader().getResource("images/tank.jpg")),
		};
		
		image.put("L", tankImages[0]);
		image.put("LU", tankImages[1]);
		image.put("U", tankImages[2]);
		image.put("RU", tankImages[3]);
		image.put("R", tankImages[4]);
		image.put("RD", tankImages[5]);
		image.put("D", tankImages[6]);
		image.put("LD", tankImages[7]);
		
//		System.out.println("tankimages :" + tankImages[0].getWidth(null)+tankImages[0].getHeight(null));
	}
	private int life = 100;
	
	/**
	 * @return the life
	 */
	public int getLife() {
		return life;
	}
	/**
	 * @param life the life to set
	 */
	public void setLife(int life) {
		this.life = life;
	}
	public boolean isGood() {
		return good;
	}
	TankClient tc;
	public static final int WIDTH = 50;
	public static final int HEIGTH = 50;
	private static final int fullBlood = 100;
	private boolean bL = false, bU = false, bR = false, bD = false;
//	不用此枚举
//	enum Direction{L,LU,U,RU,R,RD,D,LD,STOP};
	private Direction dir = Direction.STOP;
	private Direction ptDir = Direction.D;  //实现炮筒方向
	
	private static Random r = new Random();
	
	private int step = r.nextInt(12) + 3;
	
	/**
	 * <code>Tank</code>类，绘制坦克图形并具有坦克移动、射击的属性
	 * @param x 
	 * @param y
	 */
	public Tank(int x, int y, boolean good) {
		super();
		this.x = x;
		this.y = y;
		this.oldX = x;
		this.oldY = y;
		this.good = good;
	}
	public boolean isLive() {
		return live;
	}
	public void setLive(boolean live) {
		this.live = live;
	}
	public Tank(int x, int y, boolean good, Direction dir, TankClient tc){
		this(x,y,good);
		this.dir = dir;
		this.tc = tc;
	}
//	炮筒方向
	void barrelDir(Graphics g){
		switch (ptDir){
		case L:
			g.drawImage(image.get("L"), x, y, null);
			break;
		case LU:
			g.drawImage(image.get("LU"), x, y, null);
			break;
		case U:
			g.drawImage(image.get("U"), x, y, null);
			break;
		case RU:
			g.drawImage(image.get("RU"), x, y, null);
			break;
		case R:
			g.drawImage(image.get("R"), x, y, null);
			break;
		case RD:
			g.drawImage(image.get("RD"), x, y, null);
			break;
		case D:
			g.drawImage(image.get("D"), x, y, null);
			break;
		case LD:
			g.drawImage(image.get("LD"), x, y, null);
			break;
		default:
			break;
		}
	}
	void move(){
		
		this.oldX = x;
		this.oldY = y;
		
		switch (dir){
		case L:
			x -=XSPEED;
			break;
		case LU:
			x -=XSPEED;
			y -=YSPEED;
			break;
		case U:
			y -=YSPEED;
			break;
		case RU:
			x +=XSPEED;
			y -=YSPEED;
			break;
		case R:
			x +=XSPEED;
			break;
		case RD:
			x +=XSPEED;
			y +=YSPEED;
			break;
		case D:
			y +=XSPEED;
			break;
		case LD:
			x -=XSPEED;
			y +=YSPEED;
			break;
		case STOP:
			break;
		default:
			break;
			
		}
//		如果坦克方向不是Stop那么炮筒方向等于坦克方向，否则炮筒方向为最后一次坦克移动的方向。
		if(this.dir != Direction.STOP){
			this.ptDir = this.dir;
		}
		
		if(x < 0) x = 0;
		if(y < 30) y = 30;
		if(x + Tank.WIDTH > TankClient.GAME_WIDTH) x = TankClient.GAME_WIDTH - Tank.WIDTH;
		if(y + Tank.HEIGTH > TankClient.GAME_HEIGHT) y = TankClient.GAME_HEIGHT - Tank.HEIGTH;
		
		if(!good){
			Direction[] dirc = Direction.values();
			if(step==0){
				step = r.nextInt(12)+3;
				int rn = r.nextInt(dirc.length);
				dir = dirc[rn];
			}
//			每次移动有6.67%的概率发射炮弹
			if(r.nextInt(30) > 28) this.fire();
			step --;
		}
		
		
	}
	public void draw(Graphics g){
		if(!live){
			if(!good){
				tc.eTanks.remove(this);
			}
			return;
		}		
		if(good) {			
			bb.draw(g);
		}
				
		move();
		barrelDir(g);
	}
	
	private void stay(){
		x = oldX;
		y = oldY;
	}
	
	public void keyPressed(KeyEvent e){
		int key = e.getKeyCode();

		switch (key){
		
		case KeyEvent.VK_RIGHT:
			bR = true;break;
		case KeyEvent.VK_LEFT:
			bL = true;break;
		case KeyEvent.VK_UP:
			bU = true;break;
		case KeyEvent.VK_DOWN:
			bD = true;break;
			default:break;
		}
		LocateDirection();
	}
	
	public void keyReleased(KeyEvent e){
		int key = e.getKeyCode();
		
		switch (key){
		case KeyEvent.VK_CONTROL:
			fire();break;
		case KeyEvent.VK_RIGHT:
			bR = false;break;
		case KeyEvent.VK_LEFT:
			bL = false;break;
		case KeyEvent.VK_UP:
			bU = false;break;
		case KeyEvent.VK_DOWN:
			bD = false;break;
		case KeyEvent.VK_A:
			superFire();break;
//按F2键，我军坦克复活
		case KeyEvent.VK_F2:
			if(good && !live){
				live = true;
				life = fullBlood;
			}
			break;
			default:break;
		}
		LocateDirection();
	}
	
	void LocateDirection(){
		if(bL && !bU && !bR && !bD) dir = Direction.L;
		else if(bL && bU && !bR && !bD) dir = Direction.LU;
		else if(!bL && bU && !bR && !bD) dir = Direction.U;
		else if(!bL && bU && bR && !bD) dir = Direction.RU;
		else if(!bL && !bU && bR && !bD) dir = Direction.R;
		else if(!bL && !bU && bR && bD) dir = Direction.RD;
		else if(!bL && !bU && !bR && bD) dir = Direction.D;
		else if(bL && !bU && !bR && bD) dir = Direction.LD;
		else if(!bL && !bU && !bR && !bD) dir = Direction.STOP;
	}
	
	public Missile fire(){
		if(!live) return null;
		int x = this.x + Tank.WIDTH/2 - Missile.WIDTH/2;
		int y = this.y + Tank.WIDTH/2 - Missile.HEIGTH/2;
					
		Missile m = new Missile(x, y, good, ptDir, this.tc);
		tc.missiles.add(m);
		return m;
	}
	
	public Missile fire(Direction dir){
		if(!live) return null;
		int x = this.x + Tank.WIDTH/2 - Missile.WIDTH/2;
		int y = this.y + Tank.WIDTH/2 - Missile.HEIGTH/2;
					
		Missile m = new Missile(x, y, good, dir, this.tc);
		tc.missiles.add(m);
		return m;
	}
	
	public Rectangle getRect(){
		return new Rectangle(x,y,WIDTH,HEIGTH);
	}
	
	public boolean collideWithWall(Wall w){
		if(this.live && this.getRect().intersects(w.getRect())){
//			this.dir = Direction.R;
			this.stay();
			return true;
			
		}
		return false;
	}
	
	public boolean collideWithTanks(List<Tank> tanks){
	
		for(int i = 0; i < tanks.size(); i++ ){
			Tank t = tanks.get(i);
			if(this != t){
				if(this.live && t.isLive() && this.getRect().intersects(t.getRect())){
					this.stay();
					t.stay();
					return true;					
				}
			}
		}
		
		return false;
	}

	private void superFire() {
		Direction[] dirs = Direction.values();
		for (int i = 0; i < 8; i++) {
			fire(dirs[i]);
		}
	}
	
	private class BloodBar {
		public void draw(Graphics g){
			Color c = g.getColor();
			g.setColor(Color.RED);
			g.drawRect(x, y-10, WIDTH, 10);
			int w = WIDTH * life / 100;
			g.fillRect(x, y-10, w, 10);
			g.setColor(c);
		}
	}
	
	public boolean eat(Blood b) {
		if(this.live && b.getLive() && this.getRect().intersects(b.getRect())){
			this.life= fullBlood;
			b.setLive(false);
			return true;
			
		}
		return false;
	}
}
